package com.ruoyi.system.service;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import com.ruoyi.es.domain.EsDeviceDataInfo;
import com.ruoyi.es.domain.EsDeviceInfo;
import com.ruoyi.es.domain.EsValueInfo;
import com.ruoyi.system.domain.BuildingDataBoard;
import com.ruoyi.system.domain.Forest.IotDeviceInfo;
import com.ruoyi.system.domain.Forest.second.ValueResult;
import com.ruoyi.system.domain.HouseDataBoard;
import com.ruoyi.system.domain.SysDevice;
import com.ruoyi.system.domain.cache.DeviceCache;
import com.ruoyi.system.domain.result.IotDeviceBindResult;
import org.springframework.scheduling.annotation.Async;

/**
 * 设备Service接口
 * 
 * @author ruoyi
 * @date 2024-08-07
 */
public interface ISysDeviceService 
{

    /**
     * 校验设备code是否已导入
     * @param deviceCodeList
     * @return
     */
    public List<IotDeviceBindResult> checkDeviceCodeImport(List<String> deviceCodeList);
    /**
     * 记录设备日志
     * @param logInfo
     * @param deptId
     */
    public void logDeviceInfo(EsDeviceInfo logInfo, String  deptId);
    /**
     * 记录设备日志
     * @param logInfo
     * @param deptId
     */
    public void secondLogDeviceInfo(EsDeviceDataInfo logInfo, String  deptId);


    /**
     * 记录阀门日志
     * @param logInfo
     * @param deptId
     */
    public void logValueInfo(EsValueInfo logInfo, String  deptId);
    /**
     * 统计数据
     * @param deptId
     * @return
     */
    public Double selectDeviceInfoAgg(Long deptId, String colum);
    /**
     * 查询设备
     * 
     * @param deviceId 设备主键
     * @return 设备
     */
    public SysDevice selectSysDeviceByDeviceId(Long deviceId);


    /**
     * 通过设备code 查询设备信息
     * @param deviceCode
     * @return
     */
    public SysDevice selectSysDeviceByDeviceCode(String deviceCode, Long deptId);
    /**
     * 查询设备列表
     * 
     * @param sysDevice 设备
     * @return 设备集合
     */
    public List<SysDevice> selectSysDeviceList(SysDevice sysDevice);

    /**
     * 同步设备历史数据
     * @param deviceCode
     */
    @Async
    public void syncHistoryDevice(String deviceCode);

    /**
     * 新增设备
     * 
     * @param sysDevice 设备
     * @return 结果
     */
    public int insertSysDevice(SysDevice sysDevice);

    /**
     * 同步设备
     */
    @Async
    public void syncDevice(String username, Long deptId);
    /**
     * 修改设备
     * 
     * @param sysDevice 设备
     * @return 结果
     */
    public int updateSysDevice(SysDevice sysDevice);

    /**
     * 绑定设备
     *
     * @param sysDevice 设备
     * @return 结果
     */
    public int updateSysDeviceWithCode(SysDevice sysDevice);
    /**
     * 批量删除设备
     * 
     * @param deviceIds 需要删除的设备主键集合
     * @return 结果
     */
    public int deleteSysDeviceByDeviceIds(Long[] deviceIds);

    /**
     * 删除设备信息
     * 
     * @param deviceId 设备主键
     * @return 结果
     */
    public int deleteSysDeviceByDeviceId(Long deviceId);


    /**
     * 统计开栓户数
     * @param deptId
     * @return
     */
    public int useDevice(Long deptId);

    /**
     * 统计面积
     * @param deptId
     * @return
     */
    public BigDecimal selectArea(Long deptId);

    /**
     * 统计小区的用户数、集中器数
     * @param deptId
     * @return
     */
    public List<HouseDataBoard> houseList(Long deptId);

    /**
     * 统计每户的室温和累计热量
     */
    public List<BuildingDataBoard> buildingList(Long deptId,Long houseId, String buildNo);


    /**
     * 更新设备开关阀状态
     */
    public void updateDeviceStatus(DeviceCache deviceCache, ValueResult valueResult);

}
